int sudoku[9][9];


/*Fonctions génériques de test de la grille*/
/*fonction rapide mais applicable seulement a une grille complete*/
bool test_sudoku_complet(void)
{
	int i,j,k=0,l=0,m,somme_ligne=0,somme_col=0,somme_bloc=0;
	bool good=TRUE;
	/*test des lignes et des colonnes*/
	for ( i = 0 ; i < 9 ; i++ ) {
		for ( j = 0 ; j < 9 ; j++ ) {
			somme_ligne += sudoku[i][j];
			somme_col += sudoku[j][i];
		}
		if ((somme_ligne != 45) || (somme_col != 45))
			good=FALSE;
		somme_ligne = 0 ; somme_col = 0;
	}

	/*test des blocs*/
	for ( m = 0 ; m < 9 ; m++) {
		for ( i = k ; i < k + 3 ; i++ ) {
			for ( j = l ; j < l + 3 ; j++ ) {
				somme_bloc += sudoku[i][j];
			}
		}
		if (somme_bloc != 45)
			good=FALSE;
		somme_bloc=0;
		i = k; j = l;
	}
	return good;
}

/*Un peu plus lent mais applicable aux deux sortes de grilles*/
bool test_sudoku_incomplet (void) {
  bool is_good=true;
  int i,j;

  for (i=0 ; i<9 ; i++) {
    if (!test_ligne(i)) is_good=false;
    if (!test_colonne(i)) is_good=false;
  }


  for (i=0 ; i<3 ; i++)
    for (j=0 ; j<3 ; j++)
      if (!test_bloc(i,j)) is_good=false;

  return is_good;
}

/*testes si toutes les cases de la grille sont remplies*/
bool est_complet (void) {
  int i,j;

  for (i=0 ; i<9 ; i++)
    for (j=0 ; j<9 ; j++)
      if (sudoku[i][j] == 0) return false;

  return true;
}




/*existe pour tester les lignes incompletes*/
bool test_ligne(int ligne) {
  int i,j,valeurs[9]={0,0,0,0,0,0,0,0,0};

  for (i=1 ; i<10 ; i++) {
    for (j=0 ; j<9 ; j++) {
      if (sudoku[j][ligne] == i && valeurs[i-1] == 0) valeurs[i-1]=1;
      else if (sudoku[j][ligne] == i && valeurs[i-1] != 0) return false;
    }
  }
  return true;
}

/*idem pour colonnes incompletes*/
bool test_colonne(int colonne) {
  int i,j,valeurs[9]={0,0,0,0,0,0,0,0,0};

  for (i=1 ; i<10 ; i++) {
    for (j=0 ; j<9 ; j++) {
      if (sudoku[colonne][j] == i && valeurs[i-1] == 0) valeurs[i-1]=1;
      else if (sudoku[colonne][j] == i && valeurs[i-1] != 0) return false;
    }
  }
  return true;
}

/*idem pour les blocs*/
bool test_bloc(int blocX, int blocY) {
  int i,j,k,valeurs[9]={0,0,0,0,0,0,0,0,0};

  for (i=1 ; i<10 ; i++) {
    for (j=blocX*3 ; j<blocX*3+3 ; j++) {
      for (k=blocY*3 ; k<blocY*3+3 ; k++) {
        if (sudoku[j][k] == i && valeurs[i-1] == 0) valeurs[i-1]=1;
        else if (sudoku[j][k] == i && valeurs[i-1] != 0) return false;
      }
    }
  }
  return true;
}


